1Password Secrets Automationを情シスメンバーの助力を得つつ試してみた
1Password.comからSecrets Automationという新機能が公開されました。AWSのEC2インスタンス等から1Password専用サーバ接続を経由して1Password.com上のデータを読み取ったり、生成したパスワード等の秘匿データを直接1Password.com上に保存することが可能になります。
概要については大まかに把握したものの、実際の利用にはTeams及びBusinessプランが必須で、個人利用のアカウントでは試用不可能でした。やむなく社内アカウントにて試みたものの、設定時に管理者権限が必要でした。弊社情シス担当者の協力を得て、実際に1Password.comからのデータ取得までを試してみました。
1password-credentials.jsonとaccess-tokenを取得する
現時点で取得には管理者権限が必要ですが、利用自体は管理者でなくても可能です。
取得にあたっては、1Password.com右側のメニューから「Integrations」を選択します。このメニューは管理者のみ選択可能です。
手続きとしては以下の手順で行います。
- 環境を設定する
- access-tokenを作成する
- Connect Serverをデプロイする
環境を設定する
項目 | 説明 |
---|---|
Environment Name | 環境名を指定します。後から変更可能です。 |
Vaults | 取得したいデータのあるVaultを選択します。管理者が所属していないVaultも選択可能です。 |
Vaultsについては、読み書きの権限指定が可能です。今回は読み取り専用にしています。
access-tokenを作成する
項目 | 説明 |
---|---|
Token Name | トークン名を指定します。トークンは複数作成可能なため、ユニークなものにしておきます。 |
Expires After | 有効期限を指定します。今回は期限無しとしています。 |
Connect Serverをデプロイする
項目 | 説明 |
---|---|
Credentials File | Connect ServerDeploy時に必要です。 |
Access Token | アプリケーションからConnect Serverへ接続する際に必要です。 |
それぞれ生成後に直接1Passwordに保存可能で、ダウンロードせずに1Password上にて管理者権限を持たないユーザにコピーも可能です。今回作業するにあたっては、1Passwordに保存した後に1Password上でコピーする手続きをとっていただきました。
ここまで手続きを終えることで、以下の設定が作成されます。
Access Tokenについては以下のドロップダウンメニューにて、リネーム及び再生成が可能です。
Vaultsについては以下の通りに権限変更が可能です。
1Password.comからデータを取得してみる
公式ガイドではDockerとKubernetesが例に上がっています。今回はDockerにて。
公式提供のサンプルを用います。
version: "3.4" services: op-connect-api: image: 1password/connect-api:latest ports: - "8080:8080" volumes: - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json" - "data:/home/opuser/.op/data" op-connect-sync: image: 1password/connect-sync:latest ports: - "8081:8080" volumes: - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json" - "data:/home/opuser/.op/data" volumes: data:
docker-compose.yaml
自体は特に弄る必要がありません。先程生成した1password-credentials.json
をdocker-compose.yaml
と同じディレクトリに置きます。
次にConnectServerを立ち上げます。
% docker-compose up Starting 1password_deploy_op-connect-sync_1 ... done Starting 1password_deploy_op-connect-api_1 ... done Attaching to 1password_deploy_op-connect-sync_1, 1password_deploy_op-connect-api_1 op-connect-sync_1 | {"log_message":"(I) starting 1Password Connect Sync ...","timestamp":"2021-05-11T08:18:49.7666643Z","level":3} op-connect-sync_1 | {"log_message":"(I) serving on :8080","timestamp":"2021-05-11T08:18:49.7699796Z","level":3} op-connect-sync_1 | {"log_message":"(I) [discovery-local] starting discovery, advertising endpoint 8080 /meta/message","timestamp":"2021-05-11T08:18:49.7666643Z","level":3} op-connect-sync_1 | {"log_message":"(I) database initialization complete","timestamp":"2021-05-11T08:18:49.7783592Z","level":3} op-connect-sync_1 | {"log_message":"(I) ### syncer credentials bootstrap ### ","timestamp":"2021-05-11T08:18:49.7790249Z","level":3} op-connect-api_1 | {"log_message":"(I) [discovery-local] starting discovery, advertising endpoint 8080 /meta/message","timestamp":"2021-05-11T08:18:49.7901087Z","level":3} op-connect-api_1 | {"log_message":"(I) starting 1Password Connect API ...","timestamp":"2021-05-11T08:18:49.7902617Z","level":3} op-connect-api_1 | {"log_message":"(I) serving on :8080","timestamp":"2021-05-11T08:18:49.7908552Z","level":3}
APIを利用する
ローカル上のConnect Serverの受付が可能となりましたが、単にアクセスしても蹴られます。ヘッダにaccess-tokenの設定が必要となりますが、手間を省くためPythonのライブラリを用います。
READMEに従って、access-tokenを環境設定に入れておきます。
% direnv edit . export OP_CONNECT_TOKEN=XXXXXXXXXXXXXX....... % direnv allow .
とても長いトークンですが、手動で改行はしないでください。次に1Password REST APIリクエスト用のモジュールをインストールします。
% pipenv install onepasswordconnectsdk Installing onepasswordconnectsdk... Adding onepasswordconnectsdk to Pipfile's [packages]... ✔ Installation Succeeded Pipfile.lock not found, creating... Locking [dev-packages] dependencies... Locking [packages] dependencies... Building requirements... Resolving dependencies... ✔ Success! Updated Pipfile.lock (7b65ef)! Installing dependencies from Pipfile.lock (7b65ef)... ? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run.
最後にリクエストしてみます。今回のトークン発行を行うにあたって、読み込み専用の権限となっているためGET系の処理にします。
% vim run.py from onepasswordconnectsdk.client import ( Client, new_client_from_environment ) # creating client using OP_CONNECT_TOKEN environment variable client: Client = new_client_from_environment( "http://localhost:8080") vaults = client.get_vaults() for vault in vaults: print(vault)
% pipenv run python run.py Loading .env environment variables... {'attribute_version': X, 'content_version': XX, 'created_at': datetime.datetime(2019, 6, 19, 6, 24, 32, tzinfo=tzutc()), 'description': 'AWS事業本部サービスグループ', 'id': 'XXXXXXXXXXXXXXXXXXXXXX', 'items': YYY, 'name': '[AWS]サービスG', 'type': 'USER_CREATED', 'updated_at': datetime.datetime(2021, 5, 11, 6, 17, 52, tzinfo=tzutc())}
今回はVaultですが、1Password.com上から取得できました。
他にも色々と取得が可能です。詳細はAPIリファレンスを参照してください。
Secrets Automationの利用料金
Secrets Automationを用いるVaults数が3つまでは無料となっています。4 Vaults以降は有料です。
Vault数 | 料金 |
---|---|
〜25 | $29/Month |
〜100 | $99/Month |
〜500 | $299/Month |
あとがき
初期設定には管理者権限が必要であるものの、実際の利用については管理者権限が求められないため、利用者がシステム管理担当者に設定を依頼する形になるかと思われます。
ポイントとしては毎回1Passwordへのリクエストが発生するところです。1Password自体はリクエスト回数ベースでの請求ではありませんが、AWSからの利用はトラフィックに応じてAWS利用費が発生します。一度取得したデータを適切に保存して再利用するなど、リクエスト回数を減らす工夫は行うべきでしょう。